package com.gxa.eshop.service.impl;

import com.gxa.eshop.enums.ErrorCode;
import com.gxa.eshop.exception.BusinessException;
import com.gxa.eshop.pojo.CartItem;
import com.gxa.eshop.pojo.Sku;
import com.gxa.eshop.service.CartService;
import org.apache.dubbo.config.annotation.Reference;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.ObjectUtils;

import java.util.Map;

/**
 * @author bill
 * @date 2022/1/20 10:48
 */
@Service
public class CartServiceImpl implements CartService {

    @Autowired
    private RedisTemplate redisTemplate;

    //TODO 需要完成的服务模块
    @Reference
    private SkuService skuService;


    public static final String CART="cart:";

    @Override
    public void addGoodsToCart(Long userId,String  skuId,Integer num) throws BusinessException {

        //	数据库查询
      //  Sku sku = skuService.findById(skuId);

        CartItem cartItem = (CartItem) redisTemplate.boundHashOps(CART + userId).get(skuId);

        if(!ObjectUtils.isEmpty(cartItem)){
            //1.先判断该商品是否添加到购物车中，如果已经添加，增加数量
            if(cartItem.getNum()+num>sku.getNum()){
                //初步库存不足
                throw new BusinessException(ErrorCode.ERROR);
            }
            cartItem.setNum(cartItem.getNum()+num);
            cartItem.setTotalPrice(cartItem.getPrice()*cartItem.getNum());
            //2.放入更新的结果到redis中
            redisTemplate.boundHashOps(CART + userId).put(skuId,cartItem);
            return;
        }

        //2.如果没有添加，就创建一个新的购物项
        if(num>sku.getNum()){
            //初步库存不足
            throw new BusinessException(ErrorCode.ERROR);
        }

        cartItem=new CartItem();
        cartItem.setNum(num);
        cartItem.setSkuId(skuId);
        cartItem.setImage(sku.getImage());
        cartItem.setName(sku.getName());
        cartItem.setPrice(sku.getPrice());

        //设置小计  单价*数量
        cartItem.setTotalPrice(sku.getPrice()*num);

        //3.放入redis中
        redisTemplate.boundHashOps(CART + userId).put(skuId,cartItem);
    }

    @Override
    public void updateCartItemNum(Long userId,String  skuId, Integer num) {

        CartItem cartItem = (CartItem) redisTemplate.boundHashOps(CART + userId).get(skuId);

        if(!ObjectUtils.isEmpty(cartItem)){
            //1.先判断该商品是否添加到购物车中，如果已经添加，增加数量
            cartItem.setNum(num);
            cartItem.setTotalPrice(cartItem.getPrice()*cartItem.getNum());
            //2.放入更新的结果到redis中
            redisTemplate.boundHashOps(CART + userId).put(skuId,cartItem);
        }
    }

    @Override
    public void removeCartItem(Long userId,String  skuId) {
        redisTemplate.boundHashOps(CART + userId).delete(skuId);
    }

    @Override
    public void clearCart(Long userId) {
        redisTemplate.delete(CART+ userId);
    }

    @Override
    public CartItem queryUserCartItem(Long userId, String  skuId) throws BusinessException {
        CartItem cartItem = (CartItem) redisTemplate.boundHashOps(CART + userId).get(skuId);
        if(ObjectUtils.isEmpty(cartItem)){
            throw new BusinessException(ErrorCode.ERROR);
        }
        return cartItem;
    }

    @Override
    public Map queryUserCart(Long userId) {
        return redisTemplate.boundHashOps(CART + userId).entries();
    }
}
